﻿using System;
using GigaSite.Domain.Entities;
using GigaSite.Domain.Interfaces.Repositories;

namespace GigaSite.Domain.DAL.Repositories
{
    /// <summary>
    /// СУБД реализация репозитория настроек
    /// </summary>
    public class SettingsRepository: BaseRepository<Setting>, ISettingsRepository
    {
        /// <summary>
        /// Стандартный конструктор
        /// </summary>
        /// <param name="dataContext"></param>
        public SettingsRepository(GigaDataContext dataContext) : base(dataContext)
        {
        }

        /// <summary>
        /// Загружает указанную сущность по ее идентификатору
        /// </summary>
        /// <param name="id">Идентификатор сущности</param>
        /// <returns>Сущность с указанным идентификатором или Null</returns>
        public override Setting Load(long id)
        {
            return Find(s => s.Id == id);
        }

        /// <summary>
        /// Получает значение настройки по ключу
        /// </summary>
        /// <param name="name">Системное имя настройки</param>
        /// <returns>Значение настройки в виде строки</returns>
        public string GetValue(string name)
        {
            var setting = Find(s => s.Name == name);
            return setting != null ? setting.Value : null;
        }

        /// <summary>
        /// Устанавливает значение настройки по ключу
        /// </summary>
        /// <param name="name">Системное имя настройки</param>
        /// <param name="value">Значение настройки</param>
        public void SetValue(string name, string value)
        {
            var setting = Find(s => s.Name == name);
            if (setting == null)
            {
                setting = new Setting()
                              {
                                  Name = name,
                                  DateCreated = DateTime.Now
                              };
                Add(setting);
            }
            setting.Value = value;
            setting.DateModified = DateTime.Now;
            SubmitChanges();
        }
    }
}